package org.example.setup.service.impl;

import org.example.model.domain.feeback.MessageStatus;
import org.example.setup.mapper.MessagesMapper;
import org.example.setup.service.MessagesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class MessagesServiceImpl implements MessagesService {

    @Autowired
    private MessagesMapper messagesMapper;

    @Autowired
    private RedisTemplate redisTemplate;

//    @Override
//    public int dispatchUpdate(Integer num, Integer status) {
//        try {
//            ListOperations listOperations = redisTemplate.opsForList();
//            List<MessageStatus> rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);
//
//            boolean updatedInCache = false;
//            for (MessageStatus messageStatus : rows) {
//                if (messageStatus.getId().equals(num)) {
//                    messageStatus.setStatus(status);
//                    updatedInCache = true;
//                    break;
//                }
//            }
//
//            if (updatedInCache) {
//                // 如果在缓存中更新成功，异步更新数据库
//                new Thread(() -> {
//                    MessageStatus messageStatusToUpdate = new MessageStatus();
//                    messageStatusToUpdate.setId(num);
//                    messageStatusToUpdate.setStatus(status);
//                    messagesMapper.update(messageStatusToUpdate);
//                }).start();
//            } else {
//                // 如果在缓存中未找到对应的记录，直接更新数据库
//                MessageStatus messageStatusToUpdate = new MessageStatus();
//                messageStatusToUpdate.setId(num);
//                messageStatusToUpdate.setStatus(status);
//                messagesMapper.update(messageStatusToUpdate);
//                // 并更新缓存
//                rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);
//                for (MessageStatus messageStatus : rows) {
//                    if (messageStatus.getId().equals(num)) {
//                        messageStatus.setStatus(status);
//                        break;
//                    }
//                }
//            }
//            return 0;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return -1;
//        }
//    }
    @Override
    public int dispatchUpdate(Integer num, Integer status) {
        List<MessageStatus> rows = null;
        ListOperations listOperations = redisTemplate.opsForList();
        rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);
        redisTemplate.delete("EXPRESS:MESSAGE:STATUS");

        for (int i = 0; i < rows.size(); i++) {
            if( rows.get(i).getId()==num){
                rows.get(i).setStatus(status);
            }
        }
        MessageStatus messageStatus = new MessageStatus();
        messageStatus.setId(num);
        messageStatus.setStatus(status);
        messagesMapper.update(messageStatus);
        listOperations.leftPushAll("EXPRESS:MESSAGE:STATUS", rows);
        return 0;
    }

    @Override
    public List<MessageStatus> selectAll() {
        try {
            ListOperations listOperations = redisTemplate.opsForList();
            List<MessageStatus> rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);

            if (rows!= null && rows.size() > 0) {
                return rows;
            } else {
                // 如果缓存中没有数据，从数据库中查询
                List<MessageStatus> messageStatuses = messagesMapper.selectAll();
                if (messageStatuses!= null &&!messageStatuses.isEmpty()) {
                    // 将查询结果存入缓存
                    listOperations.leftPushAll("EXPRESS:MESSAGE:STATUS", messageStatuses);
                }
                return messageStatuses;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }
}

































//@Autowired
//    private MessagesMapper messagesMapper;
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    @Override
//    public int dispatchUpdate(Integer num, Integer status) {
//        List<MessageStatus> rows = null;
//        ListOperations listOperations = redisTemplate.opsForList();
//        rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);
//        redisTemplate.delete("EXPRESS:MESSAGE:STATUS");
//
//        for (int i = 0; i < rows.size(); i++) {
//            if( rows.get(i).getId()==num){
//                rows.get(i).setStatus(status);
//            }
//        }
//        MessageStatus messageStatus = new MessageStatus();
//        messageStatus.setId(num);
//        messageStatus.setStatus(status);
//        messagesMapper.update(messageStatus);
//        listOperations.leftPushAll("EXPRESS:MESSAGE:STATUS", rows);
//        return 0;
//    }
//
//    @Override
//    public List<MessageStatus>  selectAll() {
//
//        List<MessageStatus> rows = null;
//        ListOperations listOperations = redisTemplate.opsForList();
//        rows = listOperations.range("EXPRESS:MESSAGE:STATUS", 0, -1);
//
//        if(rows!=null  && rows.size()>0){
//            return rows;
//        }
//
//        List<MessageStatus> messageStatuses = messagesMapper.selectAll();
//
//        if (rows == null) {
//            List<MessageStatus> newList = new ArrayList<>();
//            listOperations.leftPushAll("EXPRESS:MESSAGE:STATUS", newList);
////            redisTemplate.expire("EXPRESS:MESSAGE:STATUS", 1, TimeUnit.HOURS);
//        } else {
//            listOperations.leftPushAll("EXPRESS:MESSAGE:STATUS", messageStatuses);
//        }
//        return messageStatuses;
//    }
